﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PConexion;
using PProtocolo;

namespace ClienteInspeccion
{
    class ClienteOM
    {
        private static string ipServidorArchivo;
        private static string puertoServidorArchivo;
        private static int puertoServidor;
        private static Conexion conexion;
        private static ProtocoloCliente cliente;

        static void Main(string[] args)
        {
            //Obtengo ip y puerto del servidor
            ipServidorArchivo = ConfigurationManager.AppSettings["IP_SERVIDOR"];
            puertoServidorArchivo = ConfigurationManager.AppSettings["PUERTO"];
            int.TryParse(puertoServidorArchivo, out puertoServidor);

            string carpetaDeTrabajo = ConfigurationManager.AppSettings["CARPETA_DE_TRABAJO"];
            Console.Title = "CLIENTE DE INSPECCION";

            

            try
            {
                bool exit = false;
                String comandoUsuario;
                Console.WriteLine("::: BIENVENIDO AL CLIENTE DE INSPECCION :::\n");

                while (!exit)
                {
                    Console.Write("COMANDO: ");
                    comandoUsuario = Console.ReadLine();

                    switch (comandoUsuario)
                    {
                        case "conectar":
                            {
                                conexion = new ConexionCliente();
                                cliente = new ProtocoloCliente();
                                cliente.EstablecerConexion(conexion);
                                conexion.AbrirConexion(ipServidorArchivo, puertoServidor);
                                //Aunque no se use debo recibir la trama
                                string idSesion = cliente.ObtenerIdSesion();
                                Console.WriteLine("\nEXITO. Conexion establecida.");
                            }
                            break;
                        case "listar":
                            //LISTAR ARCHIVOS
                            if (conexion.ConexionActiva())
                            {
                                cliente.ListarArchivosREQ();
                                ArrayList archivos;
                                archivos = cliente.ListarArchivosRES();
                                if (archivos.Count > 0)
                                {
                                    Console.WriteLine("\nLos archivos disponibles en el servidor son:");
                                    foreach (var archivo in archivos)
                                    {
                                        Console.WriteLine("-> " + archivo.ToString());
                                    }
                                }
                                else
                                {
                                    Console.WriteLine("No hay archivos en el servidor.\n");
                                }
                            }
                            break;
                        case "borrar":
                            //BORRAR UN ARCHIVO
                            if (conexion.ConexionActiva())
                            {
                                Console.WriteLine("\nIngrese el nombre del archivo a eliminar:");
                                string rutaArchivo = Console.ReadLine();
                                
                                cliente.EliminarArchivo(rutaArchivo);
                                Console.WriteLine("EXITO: El archivo fue eliminado correctamente.\n");
                            }
                            else
                                Console.WriteLine("ERROR: La conexion no se encuentra disponible.\n");
                            break;
                        case "conciliar":
                            {
                                if (conexion.ConexionActiva())
                                {
                                    Console.WriteLine("Se encontraron las siguientes diferencias:\n");
                                    ServiceReference1.IConciliacionWCF conciliacion = new ServiceReference1.ConciliacionWCFClient();
                                    foreach (string item in conciliacion.Conciliar())
                                    {
                                        Console.WriteLine("\n->" + item.ToString());
                                    } 
                                   
                                }
                                else
                                    Console.WriteLine("ERROR: La conexion no se encuentra disponible.\n");
                            }
                            break;
                        default:
                            Console.WriteLine("\nEl comando ingresado no es correcto.");
                            ListarComandos();
                            break;
                    }
                    Console.WriteLine("\n");
                }
            }
            catch (Exception)
            {
                Console.WriteLine("ERROR. No se pudo iniciar la conexion.\n");
                throw;
            }

        }

        private static long ValidarArchivo(string rutaArchivo)
        {
            //Valido si existe el archivo
            if (System.IO.File.Exists(rutaArchivo))
            {
                FileInfo f = new FileInfo(rutaArchivo);
                return f.Length;
            }
            return -1;
        }

        private static void ListarComandos()
        {
            Console.WriteLine("\nLos comandos disponibles son:\n");
            Console.WriteLine("conectar : permite la conexión con el servidor, ingresando la IP y el puerto o usando la conexion por defecto.");
            Console.WriteLine("listar : se listan los archivos disponibles en el servidor");
            Console.WriteLine("borrar : permite subir un archivo al servidor");
            Console.WriteLine("conciliar : compara los Servidores de Actididad y Conciliacion");
            Console.WriteLine("salir : cierra la aplicación");
        }

    }
}
